﻿
Imports System.Data.Entity
Imports System.Data.Entity.ModelConfiguration.Conventions
'O contexto é a classe que vai servir para efetuar o mapeamento entre as classes criadas e a base de dados
'Como Code First vai criar uma bd de acordo
Public Class ContextoStandAuto
    Inherits DbContext
    'As propriedades de acesso a cada tabela para ir buscar os dados e retornar as respetivas classes
    Public Property Veiculos As DbSet(Of Veiculo)
    Public Property Clientes As DbSet(Of Cliente)
    Public Property Compras As DbSet(Of Compra)
    Public Property Fornecedores As DbSet(Of Fornecedor)
    Public Property vendas As DbSet(Of Venda)
    Public Property vendedores As DbSet(Of Vendedor)
    Public Property Settings As DbSet(Of Setting)
    'Public Sub New()
    '    MyBase.New()
    '    Me.Configuration.LazyLoadingEnabled = True
    'End Sub
    'Protected Overrides Sub OnModelCreating(ByVal modelBuilder As DbModelBuilder)
    '    modelBuilder.Entity(Of Veiculo).
    '    HasMany(Function(t) t.Visitantes).
    '    WithMany(Function(t) t.Automoveis)
    '    modelBuilder.Conventions.Remove(Of PluralizingTableNameConvention)()
    '    modelBuilder.Conventions.Remove(Of ManyToManyCascadeDeleteConvention)()
    'End Sub
End Class

'classe para inicializar a base de dados sempre que ha alterações
'ja agora populamos com alguns dados teste
Public Class IniciarDadosTeste
    Inherits DropCreateDatabaseAlways(Of ContextoStandAuto)
    'rotina para popular dados nas tabelas
    Protected Overrides Sub Seed(context As ContextoStandAuto)

        'mapear dados
        context.Veiculos.AddRange(getVeiculosToSeed())
        context.Fornecedores.AddRange(getFornecedoresToSeed())
        context.Clientes.AddRange(getClientesToSeed())
        context.vendedores.AddRange(getVendedoresToSeed())

        'temos que guardar para poder usar as entidades adicionadas nas linhas atras nos mapeamentos de compras e vendas
        'que vamos criar nestas linhas abaixo
        context.SaveChanges()
        'mapear relações
        '#Region "compra"
        Dim compras As List(Of Compra) = New List(Of Compra)()
        compras.Add(New Compra() With {
                    .data = Convert.ToDateTime("2015-08-13"),
                    .fornecedor = context.Fornecedores.First(Function(x) x.nome = "Kasper e Mickael"),
                    .quantidade = 4,
                    .valor = 360000,
                    .veiculo = context.Veiculos.First(Function(x) x.modelo = "m4 cabrio")
                    })
        compras.Add(New Compra() With {
                    .data = Convert.ToDateTime("2015-04-08"),
                    .fornecedor = context.Fornecedores.First(Function(x) x.nome = "Marcos e Gaspar LDA"),
                    .quantidade = 6,
                    .valor = 96000,
                    .veiculo = context.Veiculos.First(Function(x) x.modelo = "serie1 116i")
                    })
        compras.Add(New Compra() With {
                    .data = Convert.ToDateTime("2015-06-19"),
                    .fornecedor = context.Fornecedores.First(Function(x) x.nome = "Xabi auto"),
                    .quantidade = 4,
                    .valor = 142400,
                    .veiculo = context.Veiculos.First(Function(x) x.modelo = "Q3 2.0 TDI")
                    })
        compras.Add(New Compra() With {
                    .data = Convert.ToDateTime("2015-07-16"),
                    .fornecedor = context.Fornecedores.First(Function(x) x.nome = "Marcos e Gaspar LDA"),
                    .quantidade = 2,
                    .valor = 130400,
                    .veiculo = context.Veiculos.First(Function(x) x.modelo = "serie3 gran turismo")
                    })
        compras.Add(New Compra() With {
                    .data = Convert.ToDateTime("2015-07-24"),
                    .fornecedor = context.Fornecedores.First(Function(x) x.nome = "Marcos e Gaspar LDA"),
                    .quantidade = 3,
                    .valor = 141120,
                    .veiculo = context.Veiculos.First(Function(x) x.modelo = "E 200 CDI")
                    })
        compras.Add(New Compra() With {
                    .data = Convert.ToDateTime("2015-10-07"),
                    .fornecedor = context.Fornecedores.First(Function(x) x.nome = "Kasper e Mickael"),
                    .quantidade = 2,
                    .valor = 30020,
                    .veiculo = context.Veiculos.First(Function(x) x.modelo = "Combo 1.3 CDTI")
                    })
        compras.Add(New Compra() With {
                    .data = Convert.ToDateTime("2015-05-07"),
                    .fornecedor = context.Fornecedores.First(Function(x) x.nome = "Xabi auto"),
                    .quantidade = 3,
                    .valor = 99603,
                    .veiculo = context.Veiculos.First(Function(x) x.modelo = "Hillux")
                    })
        compras.Add(New Compra() With {
                    .data = Convert.ToDateTime("2015-09-10"),
                    .fornecedor = context.Fornecedores.First(Function(x) x.nome = "Marcos e Gaspar LDA"),
                    .quantidade = 3,
                    .valor = 105810,
                    .veiculo = context.Veiculos.First(Function(x) x.modelo = "A4 Avante 2.0 Tdi")
                    })
        compras.Add(New Compra() With {
                    .data = Convert.ToDateTime("2015-09-09"),
                    .fornecedor = context.Fornecedores.First(Function(x) x.nome = "Xabi auto"),
                    .quantidade = 2,
                    .valor = 61312,
                    .veiculo = context.Veiculos.First(Function(x) x.modelo = "Q3 2.0 TDI")
                    })
        compras.Add(New Compra() With {
                    .data = Convert.ToDateTime("2015-06-10"),
                    .fornecedor = context.Fornecedores.First(Function(x) x.nome = "Kasper e Mickael"),
                    .quantidade = 3,
                    .valor = 31350,
                    .veiculo = context.Veiculos.First(Function(x) x.modelo = "Ibiza 1.0 MPI")
                    })
        context.Compras.AddRange(compras)
        '#End Region
        '#Region "venda"
        Dim vendas As List(Of Venda) = New List(Of Venda)()
        vendas.Add(New Venda() With {
                   .veiculo = context.Veiculos.First(Function(x) x.modelo = "serie1 116i"),
                   .cliente = context.Clientes.First(Function(x) x.nome = "Marco João"),
                   .vendedor = context.vendedores.First(Function(x) x.nome = "Carlos Pereira"),
                   .data = Convert.ToDateTime("2016-01-22"),
                   .quantidade = 1,
                   .valor = 24900
                    })
        vendas.Add(New Venda() With {
                   .veiculo = context.Veiculos.First(Function(x) x.modelo = "serie1 116i"),
                   .cliente = context.Clientes.First(Function(x) x.nome = "Rafael Alexa"),
                   .vendedor = context.vendedores.First(Function(x) x.nome = "Gervásio Palha"),
                   .data = Convert.ToDateTime("2015-07-16"),
                   .quantidade = 2,
                   .valor = 49800
                    })
        vendas.Add(New Venda() With {
                   .veiculo = context.Veiculos.First(Function(x) x.modelo = "serie1 116i"),
                   .cliente = context.Clientes.First(Function(x) x.nome = "Marco Silva"),
                   .vendedor = context.vendedores.First(Function(x) x.nome = "Anderson Mauricio"),
                   .data = Convert.ToDateTime("2013-11-14"),
                   .quantidade = 1,
                   .valor = 24900
                    })
        vendas.Add(New Venda() With {
                   .veiculo = context.Veiculos.First(Function(x) x.modelo = "m4 cabrio"),
                   .cliente = context.Clientes.First(Function(x) x.nome = "Rui Luis"),
                   .vendedor = context.vendedores.First(Function(x) x.nome = "Anderson Mauricio"),
                   .data = Convert.ToDateTime("2015-07-16"),
                   .quantidade = 1,
                   .valor = 107200
                    })
        vendas.Add(New Venda() With {
                   .veiculo = context.Veiculos.First(Function(x) x.modelo = "Hillux"),
                   .cliente = context.Clientes.First(Function(x) x.nome = "Alberto Meredeiros"),
                   .vendedor = context.vendedores.First(Function(x) x.nome = "Luís Carlos"),
                   .data = Convert.ToDateTime("2015-12-19"),
                   .quantidade = 1,
                   .valor = 37450
                    })
        vendas.Add(New Venda() With {
                   .veiculo = context.Veiculos.First(Function(x) x.modelo = "A4 Avante 2.0 Tdi"),
                   .cliente = context.Clientes.First(Function(x) x.nome = "Lucas Lima"),
                   .vendedor = context.vendedores.First(Function(x) x.nome = "Carlos Pereira"),
                   .data = Convert.ToDateTime("2015-08-12"),
                   .quantidade = 1,
                   .valor = 40063
                    })
        vendas.Add(New Venda() With {
                   .veiculo = context.Veiculos.First(Function(x) x.modelo = "Q3 2.0 TDI"),
                   .cliente = context.Clientes.First(Function(x) x.nome = "João Carvalho"),
                   .vendedor = context.vendedores.First(Function(x) x.nome = "Carlos Pereira"),
                   .data = Convert.ToDateTime("2015-07-22"),
                   .quantidade = 1,
                   .valor = 39489
                    })
        context.vendas.AddRange(vendas)
        '#End Region

        MyBase.Seed(context)
    End Sub
    Private Function getVendedoresToSeed() As ICollection(Of Vendedor)
        Dim vendedores As ICollection(Of Vendedor) = New List(Of Vendedor)
        vendedores.Add(New Vendedor() With {
                        .nome = "Luís Carlos",
                        .telefone = "919763584",
                        .contribuinte = "315488187",
                        .morada = "Praceta de Estugarda Nº56",
                        .codigoPostal = "2005-900",
                        .localidade = "Santarém"
                    })
        vendedores.Add(New Vendedor() With {
                                .nome = "Carlos Pereira",
                                .telefone = "969741213",
                                .contribuinte = "369745112",
                                .morada = "Rua Moinho de vento Nº8",
                                .codigoPostal = "1050-900",
                                .localidade = "Lisboa"
                    })
        vendedores.Add(New Vendedor() With {
                                .nome = "Gervásio Palha",
                                .telefone = "939474152",
                                .contribuinte = "364887521",
                                .morada = "Rua da ponte Nº2",
                            .codigoPostal = "1050-900",
                                .localidade = "Lisboa"})
        vendedores.Add(New Vendedor() With {
                                .nome = "Anderson Mauricio",
                                .telefone = "919875646",
                                .contribuinte = "364877522",
                                .morada = "Rua da liberdade Nº 20 ",
                            .codigoPostal = "1850-900",
                                .localidade = "Setúbal"})
        vendedores.Add(New Vendedor() With {
                                .nome = "Pedro Taborda",
                                .telefone = "916353475",
                                .contribuinte = "376489274",
                                .morada = "Rua Pisca Pisca Nº12 ",
                                .codigoPostal = "3080-900",
                                .localidade = "Leiria"})
        Return vendedores
    End Function
    Private Function getClientesToSeed() As List(Of Cliente)
        Dim clientes As List(Of Cliente) = New List(Of Cliente)

        clientes.Add(New Cliente() With {
                     .nome = "Marco Silva",
                     .codigoPostal = "2000-031",
                     .morada = "Praceta de baixo nº1 4ºdrt",
                     .telefone = "914584896",
                     .dataNascimento = Convert.ToDateTime("1975-06-05"),
                     .contribuinte = "561468156",
                     .localidade = "Santarém"})
        clientes.Add(New Cliente() With {
                     .nome = "Rafael Alexa",
                     .codigoPostal = "2000-161",
                     .morada = "Rua lá de cima nº2 2ºesq",
                     .telefone = "967131874",
                     .dataNascimento = Convert.ToDateTime("1974-09-08"),
                     .contribuinte = "694251513",
                     .localidade = "Lisboa"})
        clientes.Add(New Cliente() With {
                     .nome = "Rui Luis",
                     .codigoPostal = "2000-030",
                     .morada = "Rua antena 1 nº52 9º esq",
                     .telefone = "938548948",
                     .dataNascimento = Convert.ToDateTime("1980-01-25"),
                     .contribuinte = "451864489",
                     .localidade = "Santarém"})
        clientes.Add(New Cliente() With {
                     .nome = "Lucas Lima",
                     .codigoPostal = "2000-096",
                     .morada = "Praceta dortumd nº56 2ºdrt",
                     .telefone = "968148661",
                     .dataNascimento = Convert.ToDateTime("1982-03-29"),
                     .contribuinte = "156186164",
                     .localidade = "Bragança"})
        clientes.Add(New Cliente() With {
                     .nome = "Marco João",
                     .codigoPostal = "2000-074",
                     .morada = "Rua almeida condeixo nº45",
                     .telefone = "914924687",
                     .dataNascimento = Convert.ToDateTime("1987-09-14"),
                     .contribuinte = "366387873",
                     .localidade = "Braga"})
        clientes.Add(New Cliente() With {
                     .nome = "João Carvalho",
                     .codigoPostal = "2325-235",
                     .morada = "Rua Ali Já Venho Nº41",
                     .telefone = "911435346",
                     .dataNascimento = Convert.ToDateTime("1990-05-28"),
                     .contribuinte = "234543657",
                     .localidade = "Santarém"})
        clientes.Add(New Cliente() With {
                     .nome = "Pedro Talvez",
                     .codigoPostal = "2342-534",
                     .morada = "Rua Perto Longe Nº90",
                     .telefone = "932345456",
                     .dataNascimento = Convert.ToDateTime("1890-05-11"),
                     .contribuinte = "123456788",
                     .localidade = "Braga"})
        clientes.Add(New Cliente() With {
                     .nome = "Alberto Meredeiros",
                     .codigoPostal = "2546-747",
                     .morada = "Rua Horta Ponte nº109",
                     .telefone = "934365867",
                     .dataNascimento = Convert.ToDateTime("1879-08-12"),
                     .contribuinte = "342658703",
                     .localidade = "Porto"})
        clientes.Add(New Cliente() With {
                     .nome = "Pedro Antunes",
                     .codigoPostal = "2009-333",
                     .morada = "Rua Porta de Baixo nº13",
                     .telefone = "913564574",
                     .dataNascimento = Convert.ToDateTime("1898-12-06"),
                     .contribuinte = "345687978",
                     .localidade = "Porto"})
        Return clientes
    End Function
    Private Function getFornecedoresToSeed() As ICollection(Of Fornecedor)

        Dim fornecedores As ICollection(Of Fornecedor) = New List(Of Fornecedor)()
        fornecedores.Add(New Fornecedor() With {
                         .nome = "Marcos e Gaspar LDA",
                         .telefone = "969243187",
                         .contribuinte = "139452545",
                         .morada = "Rua de Xandre nº21",
                         .codigoPostal = "2070-378",
                         .localidade = "Alcanhões"
                         })
        fornecedores.Add(New Fornecedor() With {
                         .nome = "Kasper e Mickael",
                         .telefone = "934978213",
                         .contribuinte = "169753245",
                         .morada = "Rua do Mocho nº87",
                         .codigoPostal = "2005-061",
                         .localidade = "Santarém"
                         })
        fornecedores.Add(New Fornecedor() With {
                 .nome = "Xabi auto",
                 .telefone = "916378567",
                 .contribuinte = "521541562",
                 .morada = "Rua do papagaio roxo nº20",
                 .codigoPostal = "2070-256",
                 .localidade = "Cartaxo"
                 })
        Return fornecedores
    End Function
    Private Function getVeiculosToSeed() As ICollection(Of Veiculo)
        Dim veiculos As ICollection(Of Veiculo) = New List(Of Veiculo)
        veiculos.Add(New Veiculo() With {
                     .Marca = "BMW",
                     .modelo = "serie1 116i",
                     .cilindrada = "1499cc",
                     .potencia = "109cv",
                     .numProntas = 3,
                     .preco = 24900,
                     .descricao = "Dinamica e Eficiência"
                     })
        veiculos.Add(New Veiculo() With {
                     .cilindrada = "2979cc",
                     .descricao = "Dinamica de condução",
                     .Marca = "BMW",
                     .modelo = "m4 cabrio",
                     .numProntas = 3,
                     .potencia = "431cv",
                     .preco = 107200
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "BMW",
                     .modelo = "x6 xDrive50i",
                     .cilindrada = "4395cc",
                     .potencia = "450cv",
                     .numProntas = 5,
                     .preco = 93710,
                     .descricao = "Imponente, Robusto e dinamico"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "BMW",
                     .modelo = "x6 xDrive50i",
                     .cilindrada = "4395cc",
                     .potencia = "450cv",
                     .numProntas = 5,
                     .preco = 93710,
                     .descricao = "Imponente, Robusto e dinamico"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "BMW",
                     .modelo = "serie3 gran turismo",
                     .cilindrada = "1997cc",
                     .potencia = "190cv",
                     .numProntas = 5,
                     .preco = 68900,
                     .descricao = "Elegancia, potente e dinamico"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "Audi",
                     .modelo = "R8 spyder",
                     .cilindrada = "5204cc",
                     .potencia = "190cv",
                     .numProntas = 5,
                     .preco = 68900,
                     .descricao = "Elegancia, potente e dinamico"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "Audi",
                     .modelo = "A1",
                     .cilindrada = "999cc",
                     .potencia = "150cv",
                     .numProntas = 3,
                     .preco = 19120,
                     .descricao = "Consistente, Eficiente e Energetico"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "Audi",
                     .modelo = "R8 spyder",
                     .cilindrada = "5204cc",
                     .potencia = "525cv",
                     .numProntas = 3,
                     .preco = 223094,
                     .descricao = "Dinamico, Desportivo e Potente"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "Audi",
                     .modelo = "A1",
                     .cilindrada = "999cc",
                     .potencia = "150cv",
                     .numProntas = 3,
                     .preco = 19120,
                     .descricao = "Consistente, Eficiente e Energetico"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "Audi",
                     .modelo = "A4 Avante 2.0 Tdi",
                     .cilindrada = "1968cc",
                     .potencia = "136cv",
                     .numProntas = 5,
                     .preco = 40063,
                     .descricao = "Elegancia e Dinamica"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "Audi",
                     .modelo = "A4 1.8 TFSI",
                     .cilindrada = "1798cc",
                     .potencia = "120cv",
                     .numProntas = 5,
                     .preco = 35236,
                     .descricao = "Executivo, Elegância e Luxo"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "Audi",
                     .modelo = "Q3 2.0 TDI",
                     .cilindrada = "1968cc",
                     .potencia = "140cv",
                     .numProntas = 5,
                     .preco = 39489,
                     .descricao = "Todo o terreno e Dinamico"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "Toyota",
                     .modelo = "Hillux",
                     .cilindrada = "2494cc",
                     .potencia = "120cv",
                     .numProntas = 5,
                     .preco = 37450,
                     .descricao = "Conforto e Dinamico"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "Seat",
                     .modelo = "Ibiza 1.0 MPI",
                     .cilindrada = "999cc",
                     .potencia = "75cv",
                     .numProntas = 5,
                     .preco = 14981,
                     .descricao = "Desportivo e Dinamico"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "Seat",
                     .modelo = "Leon 1.2 TSI",
                     .cilindrada = "1197cc",
                     .potencia = "110cv",
                     .numProntas = 5,
                     .preco = 24506,
                     .descricao = "Dinamico e Eficiente"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "Opel",
                     .modelo = "Combo 1.3 CDTI",
                     .cilindrada = "1700cc",
                     .potencia = "90cv",
                     .numProntas = 3,
                     .preco = 18590,
                     .descricao = "Conforto"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "Mercedes",
                     .modelo = "E 200 CDI",
                     .cilindrada = "2143cc",
                     .potencia = "100cv",
                     .numProntas = 5,
                     .preco = 51900,
                     .descricao = "Luxo, elegante e executivo"
                     })
        veiculos.Add(New Veiculo() With {
                     .Marca = "Mercedes",
                     .modelo = "E 200 CDI",
                     .cilindrada = "2143cc",
                     .potencia = "100cv",
                     .numProntas = 5,
                     .preco = 51900,
                     .descricao = "Luxo, elegante e executivo"
                     })
        Return veiculos
    End Function
End Class